<html>
    <head>
        <title>动态声明 Dynamic Claims</title>
    </head>
    <body>
        <script>
            // 动态声明  Dynamic Claims

                    /*
                        当客户端验证并获得 "访问令牌" 或者 "身份验证cookie"时，该令牌或 cookie中的声明 Claim不会变更，除非它重新验证。

                        这对大多数生命来说不是问题，因为生命值不会经常改变。
                        但是，对于某些声明，可能需要在当前会话中声明值更改后立即查看影响。
                        （例如，如果某个角色被用户撤销，你希望在下一个请求中看到它的效果。否则，用户将继续使用该角色的权限，直到重新登录到应用程序。）


                        ABP的 "动态声明功能" 会使用这些声明的"最新值",动态覆盖客户端身份验证令牌或Cookie中的声明值。

                        "动态声明功能"是以"模块中间件"的形式配置在模块的"请求管道"中的。

                        从abp V8.0开始，所有的"启动模板" 都已经预先配置，并且默认启用动态声明功能。
                        因此，如果你使用v8.0及更高版本创建了解决方案，则无需进行任何配置。仅当你从低于8.0的版本升级时，请按照说明进行操作。
                    */

                    /*
                        一、启用/禁用动态声明
                            你可以通过以下代码启用它：
                                    public override void ConfigureServices(ServiceConfigurationContext context)
                                    {
                                        context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
                                        {
                                            options.IsDynamicClaimsEnabled = true; // true启用 ，false 禁用
                                        });
                                    }
                                
                            这通常在身份验证服务器上 (Authentication Server)完成。
                            在单体应用程序中(Single Layer Application),你通常只有一个应用程序，因此你可以对其进行配置。

                            如果你是用的是分层解决方案(Layered Solution),你还需要将RemoteRefreshUrl设置为UI应用程序中身份验证服务器的URL。
                                    public override void ConfigureServices(ServiceConfigurationContext context)
                                    {
                                        context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
                                        {
                                            options.IsDynamicClaimsEnabled = true;
                                            options.RemoteRefreshUrl = configuration["AuthServerUrl"] + options.RemoteRefreshUrl;
                                        });
                                    }

                                    RemoteRefreshUrl已在方法AddAbpOpenIdConnect和AddAbpJwtBearer中配置。
                    */
                    /*
                        二、动态声明中间件  Dynamic Claims Middleware
                              将DynamicClaims中间件添加到所有执行身份验证的应用程序（包括身份验证服务器）：

                                public override void OnApplicationInitialization(ApplicationInitializationContext context)
                                {
                                    //...
                                    app.UseDynamicClaims(); // 在授权中间件之前调用此方法。
                                    app.UseAuthorization();
                                    //...
                                }
                    */

                    /*
                        三、工作原理

                               DynamicClaims中间件将使用"ABP声明主体工程类（IAbpClaimsPrincipalFactory）" 在“每个请求中” 为当前用户（HttpContext.User）动态生成声明。

                               IAbpDynamicClaimsPrincipalContributor有三种针对不同场景的"预构建实现"：
                                            1、IdentityDynamicClaimsPrincipalContributor： 
                                                        由Identity模块提供并生成和覆盖实际的动态声明，并写入分布式存储。（通常用在分布式系统中的身份验证服务器上） 
                                                                                        
                                            2、RemoteDynamicClaimsPrincipalContributor ：
                                                        对于分布式场景，这个实现在UI应用程序中工作。
                                                        它尝试在分布式缓存中获取动态声明值。
                                                        如果在分布式缓存中没有找到，它会对身份验证服务器进行HTTP调用，并请求由身份验证服务器填充它。

                                            3、WebRemoteDynamicClaimsPrincipalContributor：
                                                        类似于RemoteDynamicClaimsPrincipalContributor，但适用于微服务应用程序。
                    */
        </script>
    </body>
</html>